package com.itheima.fileinputoutputstream;

import java.io.FileInputStream;
import java.io.InputStream;

public class FileInputStreamDemo1 {

    // 使用文件字节输入流读取文件中的字节数组到内存中，但这种方式会出现许多问题
    public static void main(String[] args) {

        // 使用文件字节输入流读取文件中的字节数组到内存中，但这种方法性能很低
//        try {
//            // 创建一个文件字节输入流管道对象
//            InputStream is = new FileInputStream("D:\\git\\java-base\\try.txt");
//
//            // 创建一个变量记录读取的字节(读不了汉字，每次读只能读1个字节)
//            int b;
//            while((b = is.read()) != -1){
//                System.out.print((char)b);
//            }
//
//            is.close();
//
//        } catch (Exception e) {
//            e.printStackTrace();
//        }

        // 每次读取多个字节，性能有所提升，因为每次读取多个字节，可以减少内存的申请次数。但读汉字仍然会出现问题
//        try {
//            // 创建一个文件字节输入流管道对象
//            InputStream is = new FileInputStream("D:\\git\\java-base\\try.txt");
//
//            // 创建一个字节数组记录读取的字节
//            byte[] buffer = new byte[3];
//            // 定义一个字节数变量，获取读到的字节数
//            int len;
//            while((len = is.read(buffer)) != -1){
//                // 如果最后一次读没有全部装满，则只打印前len个字节，因为后面的字节是前面读的字节
//                System.out.print(new String(buffer,0,len));
//            }
//
//            is.close();
//        } catch (Exception e){
//            e.printStackTrace();

        // 一次性读取全部字节，性能最高，但只适合读小文件,读取数据过大，则会抛出OutOfMemoryError异常
        try {
            InputStream is = new FileInputStream("D:\\git\\java-base\\try.txt");
//            byte[] buffer = new byte[is.available()];
//            is.read(buffer);
//            System.out.println(new String(buffer));
            byte[] bytes = is.readAllBytes();
            System.out.println(new String(bytes));
            is.close();
        }
        catch (Exception e){
            e.printStackTrace();
        }
    }
}
